package $2_2coreclasses;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;

public class FnJavaBean {

    public static void main(String[] args) throws Exception  {
        // JavaBean
        // 在Java中，有很多class的定义都符合这样的规范：若干private实例字段；通过public方法来读写实例字段。
        
        // 如果读写方法符合以下这种命名规范：读方法:public Type getXyz()；写方法:public void setXyz(Type value)
        // 那么这种class被称为JavaBean：
        // boolean字段比较特殊，它的读方法一般命名为isXyz()
        // 我们通常把一组对应的读方法（getter）和写方法（setter）称为属性（property）。
        
        // JavaBean的作用
        // JavaBean主要用来传递数据，即把一组数据组合成一个JavaBean便于传输。此外，JavaBean可以方便地被IDE工具分析，生成读写属性的代码，主要用在图形界面的可视化设计中。
        // 通过IDE，可以快速生成getter和setter。
        // 在Eclipse中，先输入以下代码：例如：public class Person{private String name;private int age;}
        // 然后，点击右键，在弹出的菜单中选择“Source”，“Generate Getters and Setters”，在弹出的对话框中选中需要生成getter和setter方法的字段，点击确定即可由IDE自动完成所有方法代码。

        // 枚举JavaBean属性
        // 要枚举一个JavaBean的所有属性，可以直接使用Java核心库提供的Introspector
        
        BeanInfo info = Introspector.getBeanInfo(Person.class);
        for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
            System.out.println(pd.getName());
            System.out.println("  " + pd.getReadMethod());
            System.out.println("  " + pd.getWriteMethod());
        }

        // 小结
        // JavaBean是一种符合命名规范的class，它通过getter和setter来定义属性；
        // 属性是一种通用的叫法，并非Java语法规定；
        // 可以利用IDE快速生成getter和setter；
        // 使用Introspector.getBeanInfo()可以获取属性列表。
    }
    public class Person {
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        private String name;
        private int age;
    }
}
